package zuoshen_mid.class1.extra_rand;

import org.junit.Test;

public class RandM_N {

    /* 默认给的一个产生任意1 ~ N随机数的方法 */
    public int rand5() {
        return (int)(Math.random() * 5 + 1);
    }


    /* 
        1. 产生一个生成一个二进制位的方法
    */
    public int rand01() {
        int res = 3;
        while (res == 3) {
            res = rand5();
        }
        /* 以3为界，将1~5的数轴二等分 */
        return res < 3 ? 0 : 1;
    }

    /* 
        2. 利用该位进行移位，得到适当的数值范围
    */
    public int randM_N(int n, int m) {
        /* 
            1. 转为 0 ~ (m-n)的随机数
         */
        int k = m - n; 

        /* 
            2. 找到表示k的二进制位数
        */
        int count = 0;
        while (k != 0) {
            k >>>= 1;
            count++;
        }

        k = m - n;
        /* 
            3. 随机生成这几位二进制数并相加
        */
        int res = k + 1;
        while (res > k) {
            res = 0;
            int t = count;
            while (t > 0) {
                res += (rand01() << (--t));
            }
        }
        /* 4. res + n即为m ~ n的数 */
        return res + n;
    }

    @Test
    public void test() {
        int count1 = 0;
        for (int i = 0; i < 10000; i++) {
            int res = randM_N(6, 10);
            System.out.println(res);
            if (res == 10) count1++;
        }
        System.out.println(count1 / (double)10000.0);
    }
}